@file:Suppress("unused", "MemberVisibilityCanBePrivate")

package com.virtualightning.mvvm.tools.shapes

import android.graphics.Canvas
import android.graphics.Paint
import android.view.MotionEvent
import kotlin.math.pow
import kotlin.math.sqrt

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/12/14 16:55
 *  图形-点
 */
class VLPoint: BaseShape() {
	// X 坐标
	var x: Float = 0f
	// Y 坐标
	var y: Float = 0f

	override fun toString(): String {
		return "VLPoint(x = $x, y = $y)"
	}

	///////////////////////////////////////////////////////////////////////////
	// 代码分割线 on 2021/12/25 10:53 下午 by CimZzz
	// 以下内容为:
	// 父类实现方法
	///////////////////////////////////////////////////////////////////////////
	/**
	 * X 轴偏移
	 * @param dx Float X 轴偏移量
	 */
	override fun onOffsetX(dx: Float) {
		x += dx
	}

	/**
	 * Y 轴偏移
	 * @param dy Float Y 轴偏移量
	 */
	override fun onOffsetY(dy: Float) {
		y += dy
	}

	/**
	 * 移动 X 轴至指定位置
	 * @param x Float X 坐标
	 */
	override fun onMoveX(x: Float) {
		this.x = x
	}

	/**
	 * 移动 Y 轴至指定位置
	 * @param y Float Y 坐标
	 */
	override fun onMoveY(y: Float) {
		this.y = y
	}

	/**
	 * 绘制图形
	 * @param canvas Canvas 画布
	 * @param paint Paint 画笔
	 */
	override fun onDraw(canvas: Canvas, paint: Paint) {
		canvas.drawPoint(x, y, paint)
	}

	///////////////////////////////////////////////////////////////////////////
	// 代码分割线 on 2021/12/25 10:53 下午 by CimZzz
	// 以下内容为:
	// 位置相关方法
	///////////////////////////////////////////////////////////////////////////

	/**
	 * 重置坐标点类
	 */
	fun reset() {
		x = 0f
		y = 0f
	}

	/**
	 * 设置坐标点
	 * @param point Point 坐标点
	 */
	fun set(point: VLPoint) {
		x = point.x
		y = point.y
	}

	/**
	 * 设置坐标点
	 * @param x Float X 坐标
	 * @param y Float Y 坐标
	 */
	fun set(x: Float, y: Float) {
		this.x = x
		this.y = y
	}

	/**
	 * 设置触摸事件坐标点
	 * @param ev MotionEvent 触摸事件
	 */
	fun setTouchEvent(ev: MotionEvent) {
		this.x = ev.x
		this.y = ev.y
	}

	/**
	 * 获取两点之间的距离
	 * @param x Float X 坐标
	 * @param y Float Y 坐标
	 * @return Float 距离
	 */
	fun distance(x: Float, y: Float): Float {
		return sqrt((this.x - x).pow(2) + (this.y - y).pow(2))
	}

	/**
	 * 获取两点之间的距离
	 * @param point Point 另外一个点
	 * @return Float 距离
	 */
	fun distance(point: VLPoint): Float {
		return distance(point.x, point.y)
	}

	/**
	 * 计算 Y 坐标偏移量
	 * @param y Float Y 坐标
	 * @return Float 偏移量
	 */
	fun distanceY(y: Float): Float {
		return this.y - y
	}

	/**
	 * 计算 Y 坐标偏移量
	 * @param point VLPoint 另外一个点
	 * @return Float 偏移量
	 */
	fun distanceY(point: VLPoint): Float {
		return distanceY(point.y)
	}

	/**
	 * 计算 X 坐标偏移量
	 * @param x Float X 坐标
	 * @return Float 偏移量
	 */
	fun distanceX(x: Float): Float {
		return this.x - x
	}

	/**
	 * 计算 X 坐标偏移量
	 * @param point VLPoint 另外一个点
	 * @return Float 偏移量
	 */
	fun distanceX(point: VLPoint): Float {
		return distanceY(point.x)
	}


	/**
	 * 取两点之间的中间点
	 * @param src Point 目标点
	 * @param dst Point 存放的中间点
	 */
	fun middlePoint(src: VLPoint, dst: VLPoint) {
		dst.set((x + src.x) / 2, (y + src.y) / 2)
	}

	/**
	 * 移动点到矩形中
	 * @param rect Rect 矩形
	 */
	fun moveInside(rect: VLRect) {
		x = when {
			x < rect.left -> rect.left
			x > rect.right -> rect.right
			else -> x
		}
		y = when {
			y < rect.top -> rect.top
			y > rect.bottom -> rect.bottom
			else -> y
		}
	}

	/**
	 * 保持 Y 坐标在指定范围内
	 * @param range VLRange 范围
	 */
	fun yInRange(range: VLRange) {
		if(this.y > range.getMax()) {
			this.y = range.getMax()
		}
		if(this.y < range.getMin()) {
			this.y = range.getMin()
		}
	}

	/**
	 * 保持 X 坐标在指定范围内
	 * @param range VLRange 范围
	 */
	fun xInRange(range: VLRange) {
		if(this.x > range.getMax()) {
			this.x = range.getMax()
		}
		if(this.x < range.getMin()) {
			this.x = range.getMin()
		}
	}
}